perm filename MACAID[MAC,LSP] blob sn#488228 filedate 1979-12-05 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	   MACAID 						  -*-LISP-*-
C00008 00003
C00011 00004
C00015 ENDMK
C⊗;
;;;   MACAID 						  -*-LISP-*-
;;;   **************************************************************
;;;   ***** MACLISP ******* MACRO DEFINITION AIDS  *****************
;;;   **************************************************************
;;;   ** (C) COPYRIGHT 1979 MASSACHUSETTS INSTITUTE OF TECHNOLOGY **
;;;   ****** THIS IS A READ-ONLY FILE! (ALL WRITES RESERVED) *******
;;;   **************************************************************

;;; Current contents:
;;;   Functs:  FLATTEN-SYMS,  |carcdrp/||,  |no-funp/||, |side-effectsp/|| 
;;;	       +INTERNAL-DUP-P
;;;   Macros:  HERALD,  DEFSIMPLEMAC,  |constant-p/||



(eval-when (eval compile)
	   (cond ((status nofeature maclisp))
		 ((status macro /#))
		 ((getl '+INTERNAL-/#-MACRO '(SUBR AUTOLOAD))
		  (setsyntax '/# 'SPLICING '+INTERNAL-/#-MACRO))
		 ((fasload (LISP) SHARPM)))
)


; This is another of those losing files that need themselves loaded in 
;   order to be able to be compiled.
(eval-when (compile)
 (and (status nofeature macaid) 	(load '((LISP) MACAID)))
)

(defmacro HERALD (package-name &optional (version-number '||))
   (let* ((file (cond ((filep infile) 
		       (caddr (truename infile)))))
	  (v 	(cond ((and file (fixp (car (errset (readlist (exploden file)) () )))) 
		          file)
		      ('t version-number))) )
	 `(PROG2 (COND ((STATUS NOFEATURE NOLDMSG)
			(TERPRI MSGFILES)
			(PRINC '|;Loading | MSGFILES)
			(PRINC ',package-name MSGFILES)
			(PRINC '| | MSGFILES)
			(PRINC ',v MSGFILES)
			(PRINC '| | MSGFILES)))
		 (DEFPROP ,package-name ,v VERSION))))

(herald MACAID /60)

(declare (special |carcdrp/||) (*expr |carcdrp/||))

;;; Many functions of one argument can be macro-expanded, providing
;;; 	that the argument-form can be multiplied.  If not, then we must
;;;	wrap a LAMBDA around it, and give it an argument-form of a symbol.

(defmacro DEFSIMPLEMAC (oname vars /&rest body &aux var name)
    (and (or (atom vars) (not (symbolp (car vars))) (cdr vars))
	 (error '|Bad arglist for DEFSIMPLEMAC| `(,oname ,vars ,@body)))
    (setq var (car vars)
	  name (cond ((eq (typep oname) 'LIST) (car oname)) (oname)))
    `(DEFMACRO ,oname ,vars
	       (SETQ ,VAR (MACROEXPAND ,VAR))
	       (COND ((|no-funp/|| ,VAR)
		      ,(cond ((cdr body) '(cons 'PROGN body))
			     ((car body))))
		     ((EQ (CAR ,VAR) 'PROG2)
		      `(PROG2 ,(cadr ,VAR) 
			      (,',name ,(caddr ,VAR))
			      ,. (cdddr ,VAR)))
		     ((EQ (CAR ,VAR) 'SETQ)
		      `(PROG2 ,,VAR (,',name ,(cadr ,VAR))))
		     ((LET ((G (GENSYM)))
			   `((LAMBDA (,g) (,',name ,g)) ,,VAR))))))

(defsimplemac |constant-p/|| (X) 
	  `(CASEQ (TYPEP ,x)
		  (SYMBOL ())
		  (LIST (MEMQ (CAR ,x) '(QUOTE FUNCTION)))
		  (T T)))

;  +INTERNAL-CARCDRP returns a -1 if arg is not a carcdr symbol, else returns
;    a 13.-bit number encoding the three things of the old carcdr property.

(defun |carcdrp/|| (x) 
  (cond ((get x 'CARCDR))
	(|carcdrp/||				;|carcdrp/|| is non-null iff  
	 (let ((n (+INTERNAL-CARCDRP x)))	; +INTERNAL-CARCDRP exists
	   (declare (fixnum n nn))
	   (cond ((< n 0) () )
		 ((putprop x 		;"cache" result on plist
		     (list* (cond ((< n 1←12.) 'A) ('D))
			    (implode 
			     `(C ,.(nconc 
				    (do ((z ()
					    (cons (cond ((zerop (boole 1 nn 1))
							 'A) 
							('D))
						  z))
					 (nn (boole 1 (lsh n -6) 63.)
					     (lsh nn -1)))
					((< nn 2) z))
				    '(R)))) 
			    (boole 1 n 63.))
		     'CARCDR)))))))

(comment FLATTEN-SYMS |no-funp/|| |side-effectsp/||)

(defun FLATTEN-SYMS (x l)
   (cond ((atom x)
	  (cond ((null x) l)
		((symbolp x) (cond ((memq x l) l) ((cons x l))))
		(l)))
	 ('t (FLATTEN-SYMS (car x) (FLATTEN-SYMS (cdr x) l)))))

(defun |no-funp/|| (x)
  (cond ((or (atom x) (memq (car x) '(QUOTE FUNCTION DECLARE))))
	((not (symbolp (car x)))  () )
	((|carcdrp/|| (car x)) (|no-funp/|| (cadr x)))
	((eq 'CXR (car x))  
	 (and (|no-funp/|| (cadr x)) (|no-funp/|| (caddr x))))
	((memq (car x) '(+ - * // \ 1+ 1- +$ -$ *$ //$ 1+$ 1-$))
	 (do ((y (cdr x) (cdr y)))
	     ((null y) t)
	   (cond ((|constant-p/|| (car y)))
		 (t (return ())))))))

;;; Non-null if it is "cheaper" to do a lambda-binding rather
;;;   than duplicating the permissibly-duplicatable code.
(defun +INTERNAL-DUP-P (x)
  (cond ((or (atom x) (memq (car x) '(QUOTE FUNCTION DECLARE))))
	((not (symbolp (car x)))  () )
	((memq (car x) '(CAR CDR CAAR CADR CDAR CDDR))
	 (or (atom (cadr x))
	     (|constant-p/|| (cadr x))))
	((eq 'CXR (car x))  
	 (and (|constant-p/|| (cadr x))
	      (or (atom (caddr x)) (|constant-p/|| (caddr x)))))
	((memq (car x) '(+ - * // \ 1+ 1- +$ -$ *$ //$ 1+$ 1-$))
	 (do ((y (cdr x) (cdr y)))
	     ((null y) t)
	   (cond ((|constant-p/|| (car y)))
		 (t (return ())))))))

(defun |side-effectsp/|| (x)
  (cond ((atom x) () )
	((memq (car x) '(QUOTE FUNCTION DECLARE)) () )
	((and (eq (typep (car x)) 'LIST) (eq (caar x) 'LAMBDA))
	 (or (mapcan '|side-effectsp/|| (cddar x))
	     (mapcan '|side-effectsp/|| (cdr x))))
	((or (not (symbolp (car x))) (get (car x) 'FSUBR)) (list 'T))
	((|carcdrp/|| (car x)) (|side-effectsp/|| (cadr x))) 
	((get (car x) '|side-effectsp/||) (mapcan '|side-effectsp/|| (cdr x)))
	((let ((nx (macroexpand-1* x)))
	      (cond ((null nx) (list 'T))
		    ((|side-effectsp/|| (car nx))))))))


(comment CARCDR and |side-effectsp/|| properties)

(and (not (boundp '|carcdrp/||))
     (not (setq |carcdrp/|| (get '+INTERNAL-CARCDRP 'SUBR)))
     (progn 	(DEFPROP CAR (A NIL . 6.) CARCDR)
		(DEFPROP CAAR (A CAR . 5.) CARCDR)
		(DEFPROP CAAAR (A CAAR . 19.) CARCDR)
		(DEFPROP CAAAAR (A CAAAR . 27.) CARCDR)
		(DEFPROP CAAADR (A CAADR . 26.) CARCDR)
		(DEFPROP CAADR (A CADR . 18.) CARCDR)
		(DEFPROP CAADAR (A CADAR . 17.) CARCDR)
		(DEFPROP CAADDR (A CADDR . 16.) CARCDR)
		(DEFPROP CADR (A CDR . 4.) CARCDR)
		(DEFPROP CADAR (A CDAR . 3.) CARCDR)
		(DEFPROP CADAAR (A CDAAR . 36.) CARCDR)
		(DEFPROP CADADR (A CDADR . 35.) CARCDR)
		(DEFPROP CADDR (A CDDR . 2.) CARCDR)
		(DEFPROP CADDAR (A CDDAR . 1.) CARCDR)
		(DEFPROP CADDDR (A CDDDR . 0.) CARCDR)
		(DEFPROP CDR (D NIL . 14.) CARCDR) 
		(DEFPROP CDAR (D CAR . 13.) CARCDR) 
		(DEFPROP CDAAR (D CAAR . 24.) CARCDR) 
		(DEFPROP CDAAAR (D CAAAR . 33.) CARCDR) 
		(DEFPROP CDAADR (D CAADR . 32.) CARCDR) 
		(DEFPROP CDADR (D CADR . 23.) CARCDR) 
		(DEFPROP CDADAR (D CADAR . 22.) CARCDR) 
		(DEFPROP CDADDR (D CADDR . 21.) CARCDR) 
		(DEFPROP CDDR (D CDR . 12.) CARCDR) 
		(DEFPROP CDDAR (D CDAR . 11.) CARCDR) 
		(DEFPROP CDDAAR (D CDAAR . 30.) CARCDR) 
		(DEFPROP CDDADR (D CDADR . 29.) CARCDR) 
		(DEFPROP CDDDR (D CDDR . 10.) CARCDR) 
		(DEFPROP CDDDAR (D CDDAR . 9.) CARCDR) 
		(DEFPROP CDDDDR (D CDDDR . 8.) CARCDR) 
		))

(mapc '(lambda (x) (putprop x 't '|side-effectsp/||))
      '(CONS NCONS XCONS ASSQ ASSOC COPYSYMBOL GET GETL 
	     GETCHAR GETCHARN IMPLODE LAST LIST LISTIFY PNGET 
	     EXPLODE EXPLODEC EXPLODEN FLATC FLATSIZE INTERN 
	     HUNK LISTARRAY MAKHUNK MAKNAM PLIST CXR 
	     MEMQ MEMBER SUBLIS SUBST REVERSE APPEND 
	     BIGP EQUAL EQ FIXP FLOATP NUMBERP SYMBOLP TYPEP
	     NOT NULL ODDP GREATERP LESSP PLUSP MINUSP ZEROP 
	     FILEP FASLP PROBEF NAMELIST NAMESTRING TRUENAME  
	PLUS DIFFERENCE TIMES QUOTIENT ADD1 SUB1 ABS 
	     + - * // 1+ 1- ↑ +$ -$ *$ //$ 1+$ 1-$ ↑$ 
	     \ \\  REMAINDER GCD EXP EXPT BOOLE > <  =
	     IFIX FIX LOG SQRT SIN COS ROT LSH FSC 
	     HAIPART HAULONG HUNKSIZE LENGTH SXHASH 
	ELT VREF VECTORP VECTOR MAKE-VECTOR VECTOR-LENGTH 
	    >= <= <$ <=$ =$ >=$ >$ 
	    *:CHARACTER-TO-FIXNUM  *:FIXNUM-TO-CHARACTER
	    FIXNUMP LIST-LENGTH CHARACTERP 
	    GET-PNAME STRING-APPEND STRINGP STRING-LENGTH 
	))


(sstatus feature MACAID)